// Return a Map of highlights found on the page,
// with the highlight id as the key and the highlight text as the value
const getAllFound = () => {
  const highlights = document.getElementsByClassName('highlighter--highlighted');
  // JM：找到页面上所有class为'highlighter--highlighted'的元素
  // 然后对每个highlight元素做map reduce操作
  // map即对每个highlight元素做动作：
  //     1. 获取高亮元素的'highlight-id'
  //     2. 获取高亮元素的文本，这里的高亮元素的文本仅是高亮内容的一部分
  //     3. 获取高亮元素的viewstate，这里每个元素的viewstate其实是重复的
  return Array.from(highlights)
    .map((highlight) => [
      highlight.getAttribute('data-highlight-id'),
      highlight.textContent.trim(),
      // highlight.textContent.replace(/\s+/ugm, ' ').trim(),
      // highlight.getAttribute('comments'),
      highlight.getAttribute('viewstate'),
    ])
    .reduce((acc, [highlightId, highlightText, viewstate]) => {
      if (acc.has(highlightId)) { // JM: 这里主要是考虑到哪些跨节点的会出现 // JM: 对于有多个block的情况，应该仅将highlightText拼接起来，viewstate只保留一个即可
        // JM：acc其实就是一个完整的highlight内容。
        // 考虑到不是同一个highlight内容的第一个元素的情况，那么acc已经存在，这里获取acc的内容，将其分隔为text和viewstate
        // 目的是将text内容进行拼接，但是viewstate仍然只要保留一个就行了。
        let [text, vs] = acc.get(highlightId).split(";_;");
        // text = text + "\n" + highlightText;
        text = text + highlightText;
        acc.set(highlightId, `${text};_;${viewstate}`); // JM：对于多个block的highlight，将文本拼接起来，但是viewstate还是一个
        // acc.set(highlightId, `${acc.get(highlightId)};=;${highlightText};_;${viewstate}`); // JM: 第一个每个highlight block的分隔符，第二个是text和viewstate的区分符
      } else {
        // JM：如果是highlight内容的第一个高亮元素，那么设置其text和viewstate
        acc.set(highlightId, `${highlightText};_;${viewstate}`); // JM：新的highlight，直接设置text;_;viewstate
      }
      return acc;
    }, new Map()); // Use a Map instead of an object since it retains order of insertion
}

export default getAllFound;
